在介面上,我們讓使用者可以註冊自己的 Script Function:
func main() {
Run(func(root *Container, state *State) {
...
})
}
例如:假如我們要放置一行文字,可以這樣做:
Text(root, "Hello world")
讓使用者可以指定 Container 的好處是,當 Package 可以提供 Sub Container,例如 Tab,就可以這樣寫:
tab1, tab2 := Tab2(root, "creat options") // tab1 和 tab2 都是 *Container
Text(tab1, "hello tab1")
Text(tab2, "hello tab2")
State 則是來處理具有使用者 Input 的部分:
name := Textbox(root, state, "What's your name")
Text(root, "hello " + name)
實作層面基本上會是 state 維護一個 map ,會存 Client 傳過來的值, Textbox 函數會去拿他對應的 value 值,最後 Textbox 函數會回傳一個字串。
如此,就做到了互動。
再舉一個 Button 作為例子:
if Button(root, state, "Click") {
Text(root, "Hello world")
}
Button 會去 state 的 map 裡面找 key "Click"
對應的 value ,然後回傳 bool: 這按鈕是否有被按。
比較特別的是,當 Script Function 跑完時,這個 Button 在 state 裡面的 map 所對應的值會被清除,因為按下這個操作,是暫時性的,不會保留給下次。